home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 011 / branch.arc / BRANCH.C next >
Text File  |  1986-03-14  |  5KB  |  261 lines

  1. /*
  2.                           BRANCH Version 1.0
  3.                        Path Management Utility
  4.                     Written by Wayne D. T. Johnson
  5.  
  6. (C) COPYRIGHT 1986 by Digital Communications Consultants, ALL RIGHTS RESERVED
  7.  
  8. BRANCH is the copyrighted property of Digital Communications Consultants.
  9. Yo⌡ arσ granteΣ ß limiteΣ licensσ t∩ usσ BRANCH¼ anΣ t∩ cop∙ i⌠ anΣ 
  10. distristribute it, provided that the following conditions are met: 
  11.  
  12. 1)  BRANCH may not be sold, however a nominal distribution fee may be charged
  13.     to cover media cost, shipping and/or handling.
  14.  
  15. 2)  All copies of this program shall contain this notice.
  16.  
  17. 3)  All derivatives of the original code (both source, object and executable
  18.     remain the property of Digital Communications Consultants, and are bound
  19.     by this license.
  20.  
  21. 4)  Digital Communications Consultants has tested the original version of
  22.     BRANCH, however, in no eveny will Digital Communications Consultants 
  23.     be liable for any damages caused by this program, or its derivatives.
  24.  
  25. Any voluntary contributions for the use of this program will be 
  26. appreciated, and should be sent to:
  27.  
  28.                          Wayne D. T. Johnson
  29.                          Digital Communications Consultants
  30.                          3947 Penn Ave No.
  31.                          Minneapolis, MN  55412
  32.  
  33.  
  34. */
  35. #include "stdio.h"
  36. #include "dos.h"
  37.  
  38. extern int errno;
  39. extern int _oserr;
  40.  
  41. #define TRUE 1
  42. #define FALSE 0
  43.  
  44. typedef struct FILE_ENT
  45.     {
  46.     char r1[21];
  47.     char attr;
  48. #define ATTR_DIR 0x10
  49.     struct 
  50.         {
  51.         unsigned hh : 5;
  52.         unsigned mm : 6;
  53.         unsigned ss : 5;
  54.         } time;
  55.     struct 
  56.         {
  57.         unsigned yy : 7;
  58.         unsigned mm : 4;
  59.         unsigned dd : 5;
  60.         } date;
  61.     long size;
  62.     char pname[13];
  63.     } FILE_ENT;
  64.  
  65. main(argc,argv)
  66. int argc;
  67. char *argv[];
  68.     {
  69.     char name[64];
  70.     char buffer[81];
  71.     char command[81];
  72.     int i;
  73.  
  74.     if (argc<2)
  75.         {
  76.         puts("format: BRANCH dos_command parameters");
  77.         exit(1);
  78.         }
  79. /*
  80.     build command
  81. */
  82.  
  83.     strcpy(command, argv[1]);
  84.  
  85.     for (i=2; i<argc; ++i)
  86.         {
  87.         strcat(command, " ");
  88.         strcat(command, argv[i]);
  89.         }
  90.  
  91.     name[0]='\\';
  92.     getdir(&name[1]);
  93. /*
  94.     if(name[1]=='\0')
  95.         name[0]='\0';
  96. */
  97.     dodir(name, command);
  98.     setdir(name);
  99.     }
  100.  
  101. dodir(name, command)
  102. char *name;
  103. char *command;
  104.     {
  105.     char newname[64];
  106.     char lastname[64];
  107.  
  108.     setdir(name);
  109.     printf("Directory: %s", name);
  110.  
  111.     system(command);
  112.  
  113.     lastname[0]='\0';
  114.  
  115.     while (TRUE)
  116.         {
  117.         strcpy(newname, name);
  118.         if(getbranch(newname, lastname))
  119.             {
  120.             dodir(newname, command);
  121.             }
  122.         else
  123.             break;
  124.         }
  125.     }
  126.  
  127. getbranch(name, last)
  128. char *name;
  129. char *last;
  130.     {
  131.     FILE_ENT file;
  132.     char mask[65];
  133.  
  134.     if (strlen(name)==1)
  135.         {
  136.         strcpy(mask, "\\*");
  137.         }
  138.     else
  139.         {
  140.         strcpy(mask, name);
  141.         strcat(mask, "\\*");
  142.         }
  143.  
  144.     if (*last=='\0')
  145.         {
  146.         if(!getfirst(mask, &file))
  147.             return FALSE;
  148.         }
  149.     else
  150.         {
  151.         getfirst(mask, &file);
  152.  
  153.         while(TRUE)
  154.             {
  155.             if (strcmp(file.pname, last)==0)
  156.                 {
  157.                 if (!getnext(mask, &file))
  158.                     return FALSE;
  159.                 break;
  160.                 }
  161.             if (!getnext(mask, &file))
  162.                 return FALSE;
  163.             }            
  164.         }
  165.  
  166.     do
  167.         {
  168.         if (file.attr&ATTR_DIR && file.pname[0]!='.')
  169.             {
  170.             if(strlen(name)!=1)
  171.                 strcat(name, "\\");
  172.             strcat(name, file.pname);
  173.             strcpy(last, file.pname);
  174.             return TRUE;
  175.             }
  176.         }
  177.         while (getnext(mask, &file));
  178.  
  179.     return FALSE;
  180.     }
  181.  
  182. setdir(addr)
  183. char *addr;
  184.     {
  185.     union REGS intregs;
  186.     int flags;
  187.  
  188.     intregs.h.ah=0x3b;
  189.     intregs.x.dx=(int)addr;
  190.     flags=intdos(&intregs,&intregs);
  191.  
  192.     if (flags&0x0100!=0)
  193.         return FALSE;
  194.  
  195.     return TRUE;
  196.     }
  197.  
  198. getdir(addr)
  199. char *addr;
  200.     {
  201.     union REGS intregs;
  202.     int flags;
  203.  
  204.     intregs.h.ah=0x47;
  205.     intregs.h.dl=0;
  206.     intregs.x.si=(int)addr;
  207.     flags=intdos(&intregs,&intregs);
  208.  
  209.     if (flags&0x0100!=0)
  210.         return FALSE;
  211.  
  212.     return TRUE;
  213.     }
  214.  
  215. getfirst(mask, file)
  216. char *mask;
  217. FILE_ENT *file;
  218.     {
  219.     union REGS intregs;
  220.     int flags;
  221.     extern int _PSP;
  222.  
  223.     setdma(file);
  224.  
  225.     intregs.h.ah=0x4e;
  226.     intregs.x.dx=(int)mask;
  227.     intregs.x.cx=16;
  228.     flags=intdos(&intregs,&intregs);
  229.  
  230.     if (flags&0x0100!=0)
  231.         return FALSE;
  232.  
  233.     return TRUE;
  234.     }
  235.  
  236. getnext(mask, file)
  237. char *mask;
  238. FILE_ENT *file;
  239.     {
  240.     union REGS intregs;
  241.     int flags;
  242.     extern int _PSP;
  243.  
  244.     intregs.h.ah=0x4f;
  245.     flags=intdos(&intregs,&intregs);
  246.  
  247.     if (flags&0x0100!=0)
  248.         return FALSE;
  249.  
  250.     return TRUE;
  251.     }
  252.  
  253. setdma(addr)
  254. char *addr;
  255.     {
  256.     union REGS intregs;
  257.  
  258.     intregs.h.ah=0x1a;
  259.     intregs.x.dx=(int)addr;
  260.     intdos(&intregs,&intregs);
  261.     }